"""
4. 切片的使用

题目：编写一个Python程序，随机生成20个由大小写字母、数字和下划线组成的字符组，并使用字符串、列表、集合和元组的方法打印出来。
对字符串和列表切片，用两种方式取出4-14位的字符。
提示：
    1. 使用random.randint()函数生成随机整数。
    2. 使用random.choice()函数从字符组中随机选择一个字符。
    3. 字符串切片：str[start:end]，列表切片：list[start:end]。
"""

import random

# 随机生成20个字符（请补充完整代码）
import random
import string

# 生成随机字符的函数
def generate_random_string(length=10):
    characters = string.ascii_letters + string.digits + '_'
    return ''.join(random.choice(characters) for _ in range(length))

# 生成20个随机字符串
random_strings = [generate_random_string(random.randint(10, 20)) for _ in range(20)]

# 转换为其他数据类型并打印
string_version = ' '.join(random_strings)  # 合并为一个长字符串
list_version = random_strings  # 本身就是列表
set_version = set(random_strings)  # 转换为集合
tuple_version = tuple(random_strings)  # 转换为元组

print("字符串版本:")
print(string_version)
print("\n列表版本:")
print(list_version)
print("\n集合版本:")
print(set_version)
print("\n元组版本:")
print(tuple_version)

# 对字符串和列表进行切片操作
# 假设我们要取第4到第14位的字符（如果长度不够则取到末尾）
string_slice1 = string_version[3:14]  # 第一种方式：直接切片（可能越界）
string_slice2 = string_version[3:min(14, len(string_version))]  # 第二种方式：安全切片（不越界）

list_slice1 = [s[3:14] for s in list_version]  # 对列表中的每个字符串进行切片（可能越界）
# 使用列表推导式时，需要处理每个字符串长度可能不足的情况
list_slice2 = [s[3:min(14, len(s))] for s in list_version]  # 安全切片（不越界）

# 打印切片结果
print("\n字符串切片（可能越界）:")
print(string_slice1)
print("\n字符串切片（不越界）:")
print(string_slice2)
print("\n列表切片（每个元素可能越界）:")
print(list_slice1)
print("\n列表切片（每个元素不越界）:")
print(list_slice2)



